package br.com.cotec.dao.impl;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Query;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.springframework.transaction.annotation.Transactional;

import br.com.cotec.dao.PerifericoDao;
import br.com.cotec.model.Equipamento;
import br.com.cotec.model.Equipamentoxperiferico;
import br.com.cotec.model.Periferico;

public class PerifericoDaoImpl extends GenericDaoImpl<Periferico, Serializable> implements PerifericoDao{

	/**
	 * {@inheritDoc}
	 */
	public boolean exists(String codigo) {
		Periferico periferico = (Periferico) getByCodigo(codigo, new Periferico());
		return periferico != null;
	}
	
	/**
	 * {@inheritDoc}
	 */	
	public List<Periferico> buscarPerifericoNaoUsado() {
		String hql = "select p " +
		   			 "from Periferico p inner join p.nomePeriferico np " +
		   			 "where np.tipoNome = 'P' and " +
		   			 "p.id not in (select ep.periferico from Equipamentoxperiferico ep)";
		
		Query query = em.createQuery(hql);
		
		return query.getResultList();
	}
	
	/**
	 * {@inheritDoc}
	 */
	@SuppressWarnings("unchecked")
	@Override
	@Transactional
	public List<Equipamentoxperiferico> getPerifericoBy(Equipamento equipamento) {
		Session hibernateSession = (Session) em.getDelegate();
		Criteria criteria = hibernateSession.createCriteria(Equipamentoxperiferico.class, "ep");
		criteria.createCriteria("ep.periferico", "per", Criteria.INNER_JOIN);
		criteria.createCriteria("ep.equipamento", "eq", Criteria.INNER_JOIN).add(Example.create(equipamento));
		
		return (List<Equipamentoxperiferico>)criteria.list();
	}

	/**
	 * {@inheritDoc}
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Equipamentoxperiferico> getEquipamentoBy(Periferico periferico) {
		Session hibernateSession = (Session) em.getDelegate();
		Criteria criteria = hibernateSession.createCriteria(Equipamentoxperiferico.class, "ep");
		criteria.createCriteria("ep.periferico", "per", Criteria.INNER_JOIN).add(Example.create(periferico));
		criteria.createCriteria("ep.equipamento", "eq", Criteria.INNER_JOIN);
		
		return (List<Equipamentoxperiferico>)criteria.list();
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	@Transactional
	public boolean hasChanged(Periferico object) {
		List<Periferico> obj = getByExample(object);
		if (obj == null || obj.size() == 0) {
			return false;
		} else {
			return true;
		}
	}
	
	/**
	 * {@inheritDoc}
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Periferico> getByExample(Periferico periferico) {
		Session hibernateSession = (Session) em.getDelegate();
		Criteria criteria = hibernateSession.createCriteria(Periferico.class, "per").add(Example.create(periferico));

		criteria.createCriteria("per.nomePeriferico", "nom", Criteria.INNER_JOIN).add(Example.create(periferico.getNomePeriferico()));
		return (List<Periferico>)criteria.list();
	}
}